home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 32 / Mac Magazin and MacEasy Magazine CD - Issue 32.iso / Multimedia / PlayerPRO 4.5.5 Dev.Kit / Plug-Ins / Sound Filters Plugs / ToneGenerator.c < prev    next >
C/C++ Source or Header  |  1995-10-08  |  10KB  |  422 lines

  1. /*    ToneGenerator    */
  2. /*    v 1.1            */
  3. /*    1995 by ANR     */
  4.  
  5.  
  6. #include "MAD.h"
  7. #include "PPPlug.h"
  8. #include "math.h"
  9.  
  10. #if defined(powerc) || defined(__powerc)
  11. enum {
  12.         PlayerPROPlug = kCStackBased
  13.         | RESULT_SIZE(SIZE_CODE( sizeof(OSErr)))
  14.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof( sData*)))
  15.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof( long)))
  16.         | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof( long)))
  17.         | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof( PPInfoPlug*)))
  18. };
  19.  
  20. ProcInfoType __procinfo = PlayerPROPlug;
  21. #else
  22. #include <A4Stuff.h>
  23. #endif
  24.  
  25. enum
  26. {
  27.     silence = 3,
  28.     triangle = 4,
  29.     square = 5,
  30.     wave = 6
  31. };
  32.  
  33. #define        PI              3.1415926535897932384626433
  34. #define        KHZ                22254.54545
  35.  
  36.  
  37. GDHandle    TheGDevice:0xCC8;
  38.  
  39. void AutoPosition( DialogPtr aDia)
  40. {
  41.     
  42.     Point    Position, mouse;
  43.     Rect    ViewRect;
  44.     short    XSize = (aDia->portRect.right - aDia->portRect.left), YSize = (aDia->portRect.bottom - aDia->portRect.top);
  45.     
  46.     
  47.     GetMouse( &mouse);
  48.     LocalToGlobal( &mouse);
  49.     
  50.     SetRect( &ViewRect, (*TheGDevice)->gdRect.left + 8, (*TheGDevice)->gdRect.top + 43,
  51.                         (*TheGDevice)->gdRect.right - 8, (*TheGDevice)->gdRect.bottom - 8);
  52.     
  53.     Position.h = mouse.h - XSize/2;
  54.     if( Position.h + XSize >= ViewRect.right) Position.h = ViewRect.right - XSize;
  55.     else if( Position.h <= ViewRect.left) Position.h = ViewRect.left;
  56.     
  57.     Position.v = mouse.v - YSize/2;
  58.     if( Position.v + YSize >= ViewRect.bottom) Position.v = ViewRect.bottom - YSize;
  59.     else if( Position.v <= ViewRect.top) Position.v = ViewRect.top;
  60.     
  61.     MoveWindow( aDia, Position.h, Position.v, false);
  62.     
  63.     ShowWindow( aDia);
  64. }
  65.  
  66. void GetDText (DialogPtr dlog, short item, StringPtr str)
  67. {
  68. Handle    itemHandle;
  69. short    itemType;
  70. Rect    itemRect;
  71.  
  72.     GetDItem (dlog, item, &itemType, &itemHandle, &itemRect);
  73.     GetIText (itemHandle, str);
  74. }
  75.  
  76. void SetDText (DialogPtr dlog, short item, Str255 str)
  77. {
  78. Handle    itemHandle;
  79. short    itemType;
  80. Rect    itemRect;
  81.  
  82.     GetDItem (dlog, item, &itemType, &itemHandle, &itemRect);
  83.     SetIText (itemHandle, str);
  84. }
  85.  
  86. Ptr    CreateAudio8Ptr( long AudioLength, long AudioFreq, long AudioAmp, long AudioType)
  87. {
  88.     Ptr        Audio8Ptr;
  89.     long    i, temp, inter, x, dest;
  90.     Boolean    UpDown;
  91.     
  92.     Audio8Ptr = NewPtr( AudioLength);
  93.     if( Audio8Ptr == 0L) return 0L;
  94.     
  95.     switch( AudioType)
  96.     {
  97.         case wave:
  98.             for( i = 0; i < AudioLength; i++)
  99.             {
  100.         
  101.                 temp = 127. * sin( ( ((double) i * (double) AudioFreq * PI * 2.) / KHZ));
  102.  
  103.                 /** Amplitude resizing **/
  104.                 temp *= AudioAmp;
  105.                 temp /= 100;
  106.  
  107.                 /** Overshoot **/
  108.                 if( temp >= 127) temp = 127;
  109.                 else if( temp <= -127 ) temp = -127;
  110.                 
  111.                 Audio8Ptr[ i] = temp;
  112.             }
  113.         break;
  114.             
  115.         case silence:
  116.             for( i = 0; i < AudioLength; i++) Audio8Ptr[ i] = 0x00;
  117.         break;
  118.         
  119.         case square:
  120.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  121.             {
  122.                 if( i > dest)
  123.                 {
  124.                     x++;
  125.                     dest = (x * KHZ) / (AudioFreq * 2);
  126.                     if( inter == -127) inter = 127;
  127.                     else inter = -127;
  128.                 }
  129.                 
  130.                 temp = inter;
  131.                 
  132.                 /** Amplitude resizing **/
  133.                 temp *= AudioAmp;
  134.                 temp /= 100;
  135.  
  136.                 /** Overshoot **/
  137.                 if( temp >= 127) temp = 127;
  138.                 else if( temp <= -127 ) temp = -127;
  139.                 
  140.                 Audio8Ptr[ i] = temp;
  141.             }
  142.         break;
  143.         
  144.         case triangle:
  145.             UpDown = true;
  146.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  147.             {
  148.                 if( i > dest)
  149.                 {
  150.                     x++;
  151.                     dest = (x * KHZ) / (AudioFreq * 2);
  152.                     inter = dest - i;
  153.                     
  154.                     UpDown = !UpDown;
  155.                 }
  156.                 
  157.                 if( UpDown) temp = (256 * (dest - i)) / inter;
  158.                 else temp = (256 * (inter - (dest - i))) / inter;
  159.                 
  160.                 temp -= 127;
  161.                 
  162.                 /** Amplitude resizing **/
  163.                 temp *= AudioAmp;
  164.                 temp /= 100;
  165.  
  166.                 /** Overshoot **/
  167.                 if( temp >= 127) temp = 127;
  168.                 else if( temp <= -127 ) temp = -127;
  169.                 
  170.                 Audio8Ptr[ i] = temp;
  171.             }
  172.         break;
  173.     }
  174.     
  175.     return Audio8Ptr;
  176. }
  177.  
  178. short* CreateAudio16Ptr( long AudioLength, long AudioFreq, long AudioAmp, long AudioType)
  179. {
  180.     short    *Audio16Ptr;
  181.     long    i, temp, inter, x, dest;
  182.     Boolean    UpDown;
  183.  
  184.     Audio16Ptr = (short*) NewPtr( AudioLength*2);
  185.     if( Audio16Ptr == 0L) return 0L;
  186.  
  187.     switch( AudioType)
  188.     {
  189.         case wave:
  190.             for( i = 0; i < AudioLength; i++)
  191.             {
  192.         
  193.                 temp = 32767. * sin( ( ((double) i * (double) AudioFreq * PI * 2.) / KHZ));
  194.  
  195.                 /** Amplitude resizing **/
  196.                 temp *= AudioAmp;
  197.                 temp /= 100;
  198.  
  199.                 /** Overshoot **/
  200.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  201.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  202.                 
  203.                 Audio16Ptr[ i] = temp;
  204.             }
  205.         break;
  206.             
  207.         case silence:
  208.             for( i = 0; i < AudioLength; i++) Audio16Ptr[ i] = 0x00;
  209.         break;
  210.         
  211.         case square:
  212.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  213.             {
  214.                 if( i > dest)
  215.                 {
  216.                     x++;
  217.                     dest = (x * KHZ) / (AudioFreq * 2);
  218.                     if( inter == -32767L) inter = 32767L;
  219.                     else inter = -32767L;
  220.                 }
  221.                 
  222.                 temp = inter;
  223.                 
  224.                 /** Amplitude resizing **/
  225.                 temp *= AudioAmp;
  226.                 temp /= 100;
  227.  
  228.                 /** Overshoot **/
  229.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  230.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  231.                 
  232.                 Audio16Ptr[ i] = temp;
  233.             }
  234.         break;
  235.         
  236.         case triangle:
  237.             UpDown = true;
  238.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  239.             {
  240.                 if( i > dest)
  241.                 {
  242.                     x++;
  243.                     dest = (x * KHZ) / (AudioFreq * 2);
  244.                     inter = dest - i;
  245.                     
  246.                     UpDown = !UpDown;
  247.                 }
  248.                 
  249.                 if( UpDown) temp = (65535L * (dest - i)) / inter;
  250.                 else temp = (65535L * (inter - (dest - i))) / inter;
  251.                 
  252.                 temp -= 32767L;
  253.                 
  254.                 /** Amplitude resizing **/
  255.                 temp *= AudioAmp;
  256.                 temp /= 100;
  257.  
  258.                 /** Overshoot **/
  259.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  260.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  261.                 
  262.                 Audio16Ptr[ i] = temp;
  263.             }
  264.         break;
  265.     }
  266.  
  267.     return Audio16Ptr;
  268. }
  269.  
  270. OSErr main(     sData                    *theData,
  271.                 long                    SelectionStart,
  272.                 long                    SelectionEnd,
  273.                 PPInfoPlug                *thePPInfoPlug)
  274. {
  275. long                i, AudioLength, AudioFreq, AudioAmp;
  276. Ptr                    Sample8Ptr = theData->data, Audio8Ptr;
  277. short                *Sample16Ptr = (short*) theData->data, *Audio16Ptr;
  278. DialogPtr            myDia;
  279. short                itemHit, itemType, AudioType;
  280. Handle                itemHandle;
  281. Rect                itemRect;
  282. Str255                tStr;
  283. OSErr                iErr;
  284.  
  285. #ifndef powerc
  286.     long    oldA4 = SetCurrentA4();             //this call is necessary for strings in 68k code resources
  287. #endif
  288.  
  289.     myDia = GetNewDialog( 128, 0L, (WindowPtr) -1L);
  290.     SetPort( myDia);
  291.     AutoPosition( myDia);
  292.     /** Default values **/
  293.     
  294.     AudioType = silence;
  295.     GetDItem( myDia, AudioType, &itemType, &itemHandle, &itemRect);
  296.     SetCtlValue( (ControlHandle) itemHandle, 255);
  297.     
  298.     AudioLength = SelectionEnd - SelectionStart;
  299.     if( theData->amp == 16) AudioLength /= 2;
  300.     if( AudioLength <= 0) AudioLength = 2000;
  301.     NumToString( AudioLength, tStr);    SetDText( myDia, 8, tStr);
  302.         
  303.     AudioFreq    = 440;                                NumToString( AudioFreq, tStr);        SetDText( myDia, 9, tStr);
  304.     AudioAmp    = 100;                                NumToString( AudioAmp, tStr);        SetDText( myDia, 10, tStr);
  305.     
  306.     SelIText( myDia, 8, 0, 10000);
  307.     /********************/
  308.     
  309.     Audio8Ptr    = 0L;    Audio16Ptr    = 0L;
  310.     
  311.     do
  312.     {
  313.         #if defined(powerc) || defined(__powerc)
  314.         ModalDialog( thePPInfoPlug->MyDlgFilterUPP, &itemHit);
  315.         #else
  316.         ModalDialog( (ModalFilterProcPtr) thePPInfoPlug->MyDlgFilterUPP, &itemHit);
  317.         #endif
  318.         
  319.         switch( itemHit)
  320.         {
  321.             case 7:
  322.                 GetDText( myDia, 8, tStr);        StringToNum( tStr, &AudioLength);
  323.                 GetDText( myDia, 9, tStr);        StringToNum( tStr, &AudioFreq);
  324.                 GetDText( myDia, 10, tStr);        StringToNum( tStr, &AudioAmp);
  325.                 
  326.                 switch( theData->amp)
  327.                 {
  328.                     case 8:
  329.                         if( Audio8Ptr != 0L) { DisposPtr( Audio8Ptr);            Audio8Ptr = 0L;}
  330.                         Audio8Ptr    = CreateAudio8Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  331.                         if( Audio8Ptr != 0L)
  332.                         {
  333.                             iErr = CallRPlaySoundUPP( Audio8Ptr, AudioLength, 0, 0xFF, theData->amp, 0, 0);
  334.                         }
  335.                     break;
  336.                     
  337.                     case 16:
  338.                         if( Audio16Ptr != 0L) { DisposPtr( (Ptr) Audio16Ptr);    Audio16Ptr = 0L;}
  339.                         Audio16Ptr    = CreateAudio16Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  340.                         if( Audio16Ptr != 0L)
  341.                         {
  342.                             iErr = CallRPlaySoundUPP( (Ptr) Audio16Ptr, AudioLength*2, 0, 0xFF, theData->amp, 0, 0);
  343.                         }
  344.                     break;
  345.                 }
  346.             break;
  347.         
  348.             case 20:
  349.             case 19:
  350.             case 17:
  351.             case 18:
  352.             case 16:
  353.             case 3:
  354.             case 4:
  355.             case 5:
  356.             case 6:
  357.             
  358.                 switch( itemHit)
  359.                 {
  360.                     case 19:
  361.                     case 20:    itemHit = 3;    break;
  362.                     case 18:    itemHit = 5;    break;
  363.                     case 17:    itemHit = 4;    break;
  364.                     case 16:    itemHit = 6;    break;
  365.                 }
  366.             
  367.                 for( i = 3; i <= 6;i ++)
  368.                 {
  369.                     GetDItem( myDia, i, &itemType, &itemHandle, &itemRect);
  370.                     SetCtlValue( (ControlHandle) itemHandle, 0);
  371.                 }
  372.                 
  373.                 AudioType = itemHit;
  374.                 GetDItem( myDia, AudioType, &itemType, &itemHandle, &itemRect);
  375.                 SetCtlValue( (ControlHandle) itemHandle, 255);
  376.             break;
  377.         }
  378.         
  379.     }while( itemHit != 1 && itemHit != 2);
  380.     
  381.     if( itemHit == 1)
  382.     {
  383.         Ptr        resultPtr;
  384.         
  385.         GetDText( myDia, 8, tStr);        StringToNum( tStr, &AudioLength);
  386.         GetDText( myDia, 9, tStr);        StringToNum( tStr, &AudioFreq);
  387.         GetDText( myDia, 10, tStr);        StringToNum( tStr, &AudioAmp);
  388.         
  389.         if( Audio16Ptr != 0L)    {    DisposPtr( (Ptr) Audio16Ptr);            Audio16Ptr = 0L;}
  390.         if( Audio8Ptr != 0L)    {    DisposPtr( (Ptr) Audio8Ptr);            Audio8Ptr = 0L;}
  391.         
  392.         switch( theData->amp)
  393.         {
  394.             case 8:        Audio8Ptr    = CreateAudio8Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);    break;
  395.             case 16:
  396.                 Audio16Ptr    = CreateAudio16Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  397.                 AudioLength *= 2;
  398.             break;
  399.         }
  400.         
  401.         resultPtr = NewPtr( theData->size - (SelectionEnd - SelectionStart) + AudioLength);
  402.         
  403.         BlockMove( theData->data, resultPtr, SelectionStart);
  404.         
  405.         if( theData->amp == 8) BlockMove( Audio8Ptr, resultPtr + SelectionStart, AudioLength);
  406.         else BlockMove( Audio16Ptr, resultPtr + SelectionStart, AudioLength);
  407.         
  408.         BlockMove( theData->data + SelectionEnd, resultPtr + SelectionStart + AudioLength, theData->size - SelectionEnd);
  409.         
  410.         DisposPtr( theData->data);        DisposPtr( Audio8Ptr);
  411.         theData->data = resultPtr;
  412.         theData->size = theData->size  - (SelectionEnd - SelectionStart) + AudioLength;
  413.     }
  414.     
  415.     DisposDialog( myDia);
  416.  
  417.     #ifndef powerc
  418.         SetA4( oldA4);
  419.     #endif
  420.  
  421.     return noErr;
  422. }